#ifndef _INODE_H_
#define _INODE_H_

#include <time.h>
#include <stdint.h>
#include <stdbool.h>
#include "disk.h"

#define TOTAL_INODES 32768
#define FILENAME_LEN 24
#define INODE_PER_BLOCK (BLOCK_SIZE/INODE_SIZE)
#define FILE_PER_BLOCK 128
#define FILE_SIZE_MAX (BLOCKID_PER_BLOCK*BLOCK_SIZE)
#define BLOCKID_PER_BLOCK 2048
#define INODE_SIZE      (sizeof(inode_t))
#define FILE_SIZE       (sizeof(file_t))
#define FIRST_INODE_BLOCK     3
#define FIRST_DATA_BLOCK     (FIRST_INODE_BLOCK+TOTAL_INODES/INODE_PER_BLOCK)

// inode结构体
typedef struct {
    struct timespec atime;        // 最后访问时间
    struct timespec mtime;        // 最后修改时间
    struct timespec ctime;        // 状态最后改变时间
    uint32_t size;   //占用的字节数,文件至多8MB
    uint16_t indirect;//间接指针,每个block_id占2Byte, 一个block 4KB可以存2048个block_id,1个间接指针足矣
    bool is_dir;//是否为目录
    uint32_t pading[2];//对齐到64Bytes
} inode_t;//64Bytes

typedef struct{
    char filename[FILENAME_LEN+1];//+1是预留末尾'\0'
    bool is_dir;//是否为目录
    uint16_t inode_id;
    uint32_t padding;//为了对齐到32B
}file_t;//对齐后,32Bytes



typedef union{
    inode_t inode[INODE_PER_BLOCK];
    uint16_t blk_id[BLOCKID_PER_BLOCK];//存block id,可以存2048个
    uint8_t data[BLOCK_SIZE];//存数据, 4KB
    file_t file[INODE_PER_BLOCK];//存文件, 最多存 4KB/32B = 128 个
}block_t;

void init_root_inode() ;
inode_t get_inode(uint16_t inode_id);
inode_t get_inode_by_path(char* path,uint16_t*inode_id);
int mk(const char *path, bool directory, uint16_t id);
uint16_t get_all_items(inode_t inode, file_t* items);
void set_inode(inode_t cur, uint16_t inode_num);
void resize_inode(inode_t* inode, uint32_t size);
int rm_file(const char *path,bool release,uint16_t* inode_id);
int read_file(inode_t* inode, uint16_t inode_id, uint32_t size, int offset, char* buffer);
int write_file(inode_t* inode, uint16_t inode_id, uint32_t size, int offset, char* buffer);
#endif